﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed

#pragma once
#include "GcmpModelInterface.h"
#include <vector>
#include <string>

namespace gcmp
{
    class IDocument;
    class ElementId;
    class Vector3d;

    /// \brief 复制粘贴板接口
    class GCMP_MODEL_INTERFACE_EXPORT IClipBoard
    {
    public:
        /// \brief 获取默认的复制粘贴板
        ///
        /// 通过此接口获取平台提供的默认复制粘贴板
        /// 
        /// \return IClipBoard* 复制粘贴板指针
        static IClipBoard* Get();

    public:
        /// \brief 复制
        ///
        /// 前置：有粘贴内容（即HasContent返回true）
        ///
        /// \param pDocumentFrom 源文档
        /// \param viewIdFrom 源视图
        /// \param copyingElementIds 正在复制的Elements的Id
        /// \return bool true表示复制成功；false表示前置条件不满足或者复制失败
        virtual bool Copy(
            IDocument* pDocumentFrom, 
            const ElementId & viewIdFrom, 
            const std::vector<ElementId> & copyingElementIds
        ) = 0;

        /// \brief 粘贴
        ///
        /// 前置：有粘贴内容（即HasContent返回true）
        ///
        /// \param pDocumentTo 目标文档
        /// \param viewIdTo 目标视图
        /// \param insertPoint 插入点
        /// \param pastedElementIds 粘贴得到的Elements的Id
        /// \return bool true表示粘贴成功；false表示前置条件不满足或者粘贴失败
        virtual bool Paste(
            IDocument* pDocumentTo, 
            const ElementId & viewIdTo, 
            const Vector3d & insertPoint, 
            std::vector<ElementId> & pastedElementIds
        ) = 0;

        /// \brief 查询粘贴板是否有内容
        ///
        /// \return bool true表示有内容；false表示没有内容
        virtual bool HasContent() const = 0;

        /// \brief 设置错误信息
        ///
        /// \param errorMessage 错误信息字符串
        /// \return void
        virtual void SetErrorMessage(const std::wstring& errorMessage) = 0;

        /// \brief 获取最后的错误信息
        ///
        /// \return std::wstring 错误信息字符串
        virtual const std::wstring& GetLastErrorMessage() = 0;

    public:
        /// \brief 析构函数
        virtual ~IClipBoard(void) = 0;
    };
}


